import re

import numpy as np
from flask import jsonify


def add_line_numbers(code):

  # 按行分割代码
  code_lines = code.splitlines()

  # 为每行代码添加行号
  numbered_code = "\n".join([f"{i + 1}: {line}" for i, line in enumerate(code_lines)])
  return numbered_code

def wave_to_spectrum(fs ,waveY):
  """
  将 waveValue 转换为 spectrumValue（频谱数据）。
  :param data: 包含 waveValue 和 fs 的 JSON 数据
  :return: spectrumX, spectrumY
  """

  # 检查 waveY 是否为空
  if len(waveY) == 0:
    return np.array([]), np.array([])

  # 采样频率 fs
  n = len(waveY)  # 采样点数

  # 计算 FFT
  spectrumY_complex = np.fft.fft(waveY)
  spectrumY = np.abs(spectrumY_complex) / n * 2  # 取模并归一化
  spectrumY[0] /= 2  # 直流分量不需要乘 2

  # 计算频率轴 spectrumX
  spectrumX = np.fft.fftfreq(n, d=1.0 / fs)
  spectrumX = spectrumX[:n // 2]  # 取一半（正频率部分）
  spectrumY = spectrumY[:n // 2]  # 取前半部分频谱

  return spectrumX, spectrumY

def parse_wave_data(data):
  """
  从JSON数据中提取rev、waveValue和fs。

  :param data: 包含波形数据的JSON对象
  :return: rev, waveValue, fs
  """
  # 提取数据，使用get防止KeyError
  rev = data.get('rev', 0)

  fs = data.get('fs', 0)

  # 解析 waveValue
  wave_value = data.get('waveValue', {})
  waveY = np.array(wave_value.get('waveY', []), dtype=float)

  spectrumX,spectrumY = wave_to_spectrum(fs, waveY)
  return rev, spectrumX,spectrumY

  # 转换数据类型（如果需要）
  # try:
  #   rev = float(rev) if '.' in rev else int(rev)
  # except ValueError:
  #   rev = 0

  # try:
  #   fs = float(fs) if '.' in fs else int(fs)
  # except ValueError:
  #   fs = 0



def filtetpar(json_list):
  # 取第一个 JSON
  first_json = json_list[0]

  # 取 spectrumY 和 spectrumX
  amplitudes = first_json["data"]["spectrumValue"]["spectrumY"]
  frequencies = first_json["data"]["spectrumValue"]["spectrumX"]
  frequencies = np.array(frequencies)
  amplitudes = np.array(amplitudes)

  return frequencies,amplitudes

def response_json(code=200, message="Success", data=None):
    """
    统一格式化 JSON 响应

    :param code: HTTP 状态码（默认 200）
    :param message: 提示信息（默认 "Success"）
    :param data: 需要返回的数据（默认 None）
    :return: JSON 响应
    """
    response = {
      "code": code,
      "message": message,
      "data": data
    }
    return jsonify(response), code


#扩展 Flask 接口的清理函数
def preprocess_macros(c_code: str) -> str:
    macros = {}
    macro_pattern = re.compile(r'#define\s+(\w+)(\((.*?)\))?\s+(.*)')
    lines = c_code.splitlines()
    cleaned_lines = []

    # 第一步：清洗掉所有注释
    # 1. 删除单行注释
    c_code = re.sub(r'//.*', '', c_code)
    # 2. 删除多行注释
    c_code = re.sub(r'/\*.*?\*/', '', c_code, flags=re.DOTALL)

    # 第二步：收集所有宏定义
    lines = c_code.splitlines()
    for line in lines:
        match = macro_pattern.match(line.strip())
        if match:
            name = match.group(1)
            params = match.group(3)
            body = match.group(4)
            if params:
                param_list = [p.strip() for p in params.split(',')]
                macros[name] = ('func', param_list, body)
            else:
                macros[name] = ('simple', body)
        elif line.strip().startswith('#'):
            continue
        else:
            cleaned_lines.append(line)

    code = '\n'.join(cleaned_lines)

    # 第三步：专门处理 WriteLine 宏
    code = code.replace('WriteLine()', 'printf("\\n")')

    # 第四步：替换函数宏
    for name, val in macros.items():
        if val[0] == 'func':
            param_list, body = val[1], val[2]
            # 用正则匹配函数调用，替换函数宏
            pattern = re.compile(rf'\b{name}\s*\((.*?)\)')

            def replace_func(match):
                args = [a.strip() for a in match.group(1).split(',')]
                temp_body = body
                for p, a in zip(param_list, args):
                    temp_body = temp_body.replace(p, a)
                return temp_body

            code = pattern.sub(replace_func, code)

    # 第五步：替换简单宏
    for name, val in macros.items():
        if val[0] == 'simple':
            # 避免替换变量名子串，如 longlong 被替换成 long
            code = re.sub(rf'\b{name}\b', val[1], code)

    # 返回清理后的代码
    return code